home *** CD-ROM | disk | FTP | other *** search
- (*===========================================================================*)
- (* Add/init users *)
- (* *)
- (* Copyright 1988, 1989, 1990, 1991 by H. Roy Engehausen. All rights *)
- (* reserved. *)
- (* *)
- (*===========================================================================*)
-
- (*===========================================================================*)
- (* Add uid to user list *)
- (*===========================================================================*)
-
- PROCEDURE add_uid (uid_to_add : user_record_ptr);
-
- VAR
- uid_index_current : user_index_ptr;
-
- BEGIN;
-
- {$IFDEF POINT_CHK}
- test_pointer(uid_to_add);
- {$ENDIF}
-
- (*-----------------------------------------------------------------------*)
- (* Obtain the interrupt lock *)
- (*-----------------------------------------------------------------------*)
-
- get_semaphore(semaphore_interrupts, sem_exclusive, FALSE);
-
- IF uid_free <> NIL THEN
- BEGIN;
-
- {$IFDEF POINT_CHK}
- test_pointer(uid_free);
- {$ENDIF}
-
- uid_index_current := uid_free;
- uid_free := uid_index_current^.user_next;
-
- END
- ELSE
- BEGIN;
-
- NEW(uid_index_current);
- uid_total := uid_total + 1;
- uid_index_current^.user_recno := uid_total;
-
- END;
-
- uid_to_add^.user_i_ptr := uid_index_current;
-
- WITH uid_index_current^ DO
- BEGIN
-
- user_id := uid_to_add^.user_id;
-
- IF (uid_to_add^.user_flag AND user_f_delete) <> 0 THEN
- BEGIN;
- user_next := uid_free;
- uid_free := uid_index_current;
- END
- ELSE
- insert_uid(uid_index_current);
-
- IF user_recno > uid_total THEN
- BEGIN;
- WRITELN('Add failure!');
- WRITELN('ARecord =', user_recno);
- WRITELN('Utotal =', uid_total);
- WRITELN('tcb =', active_tcb^.port_chan_s);
- user_recno := uid_total;
- EXIT;
- END;
-
- SEEK(uid_file, user_recno);
-
- WRITE(uid_file, uid_to_add^);
-
- END;
-
- (*-----------------------------------------------------------------------*)
- (* Release the interrupt lock *)
- (*-----------------------------------------------------------------------*)
-
- free_semaphore(semaphore_interrupts);
-
- END;
-
- (*===========================================================================*)
- (* Initialize a user's record *)
- (*===========================================================================*)
-
- PROCEDURE uid_init(uid_data : user_record_ptr);
- BEGIN;
-
- {$IFDEF POINT_CHK}
- test_pointer(uid_data);
- {$ENDIF}
-
- FILLCHAR(uid_data^, SIZEOF(user_record_type), CHR(0));
-
- uid_data^.user_name := '?';
- uid_data^.user_port := active_port^.port_char;
- uid_data^.user_class := user_c_nu;
- uid_data^.user_scr_len := active_port^.dflt_scrl;
- uid_data^.user_lang := '?';
- uid_data^.user_fmt := active_port^.new_display;
- uid_data^.user_l_time := last_midnight
- - LONGINT(opt_block.newuser_l_time)
- * ticks_per_day;
-
- IF active_port^.port_dflt_trans THEN
- uid_data^.user_flag := user_f_trans;
-
- END;
-
- (*===========================================================================*)
- (* Insert a user's record into the chain *)
- (*===========================================================================*)
-
- PROCEDURE insert_uid(uid_to_ins : user_index_ptr);
-
- VAR
-
- uid_last : user_index_ptr;
- uid_work : user_index_ptr;
-
- BEGIN;
-
- {$IFDEF POINT_CHK}
- test_pointer(uid_to_ins);
- {$ENDIF}
-
- uid_last := NIL;
- uid_work := uid_chain;
-
- WHILE (uid_work <> NIL) AND (uid_work^.user_id < uid_to_ins^.user_id) DO
- BEGIN;
-
- {$IFDEF POINT_CHK}
- test_pointer(uid_work);
- {$ENDIF}
-
- uid_last := uid_work;
- uid_work := uid_work^.user_next;
-
- END;
-
- IF (uid_work <> NIL) AND (uid_work^.user_id = uid_to_ins^.user_id) THEN
- WRITELN('Duplicate userids -- ', uid_work^.user_id);
-
- IF uid_last = NIL THEN
- BEGIN;
- uid_to_ins^.user_next := uid_chain;
- uid_chain := uid_to_ins;
- END
- ELSE
- BEGIN;
- uid_to_ins^.user_next := uid_last^.user_next;
- uid_last^.user_next := uid_to_ins;
- END;
-
- END;